﻿Imports Microsoft.SharePoint.Taxonomy
Imports Microsoft.SharePoint
Imports System.Globalization

Module DotNetManiaManagedMetadata

    Sub Main2()
        'Creamos el objeto SPSite para poder crear la sesion de metadatos
        'El using es para que nos olvidemos de hacer dispose(), así que 
        'cuando salga de la instrucción Using liberará la memoria de SPSite
        Using coleccionDesitios As New SPSite("http://webdevelop.sqlint.local")

            'Creamos la sesion de metadatos desde la cual accederemos a todos 
            'los almacenes de datos disponibles para esa colección de sitios
            Dim sesion As New TaxonomySession(coleccionDesitios)

            'El objeto TaxonomySession tiene una propiedad que almacena 
            'el almacén de términos predeterminado
            Dim AlmacenTerminos As TermStore = sesion.DefaultSiteCollectionTermStore

            'Mostramos el nombre del almacén de términos
            Console.WriteLine(AlmacenTerminos.Name)
        End Using
        Console.ReadLine()

    End Sub

    Sub Main1()
        Using coleccionDesitios As New SPSite("http://webdevelop.sqlint.local")
            Dim sesion As New TaxonomySession(coleccionDesitios)

            'Obtengo todos los TermStores de la TexonomySession
            For Each almacen As TermStore In sesion.TermStores
                Console.WriteLine("Almacén de términos: " & almacen.Name)

                'Obtengo todos los grupos de cada uno de los TermStores
                For Each grupo As Group In almacen.Groups
                    Console.WriteLine("   Grupo: " & grupo.Name)

                    'Obtengo todos los TermSet de cada uno de los grupos
                    For Each conjuntoTerminos As TermSet In grupo.TermSets
                        Console.WriteLine("      Conjunto de términos: " & _
                                          conjuntoTerminos.Name)

                        'Obtengo todos los términos de cada uno de los TermSets
                        For Each termino As Term In conjuntoTerminos.Terms
                            Console.WriteLine("         Término: " & termino.Name)

                            'Si el término tiene subtérminos tambien los obtengo con una 
                            'funcion recursiva
                            If termino.TermsCount > 0 Then
                                ImprimirSubTerminos(termino, 1)
                            End If
                        Next
                    Next
                Next
            Next
        End Using
        Console.ReadLine()

    End Sub


    'Funcion recursiva para obtener todos los subtérmino de un término
    Sub ImprimirSubTerminos(ByVal termino As Term, ByVal nivel As Integer)

        'Obtengo todos los subtérminos del Term
        For Each subtermino As Term In termino.Terms

            'Este contador se usa para dejar tantos espacios como
            'niveles tengamos en la jerarquía
            Dim numEspacios As Integer = 1
            numEspacios = numEspacios * nivel
            For i As Integer = 1 To numEspacios
                Console.Write(" ")
            Next
            Console.WriteLine("         SubTérmino: " & subtermino.Name)

            'Si el subTérmino tiene a su vez subtérminos los muestro
            'también invocando a la función recursiva
            If subtermino.TermsCount > 0 Then
                ImprimirSubTerminos(subtermino, nivel + 1)
            End If
        Next
    End Sub


    Sub Main()
        Using coleccionDesitios As New SPSite("http://webdevelop.sqlint.local")
            Dim sesion As New TaxonomySession(coleccionDesitios)
            Dim AlmacenTerminos As TermStore = sesion.DefaultSiteCollectionTermStore
            Dim grupo As Group = AlmacenTerminos.Groups("Grupo")
            Dim conjuntoDeTerminos As TermSet = grupo.TermSets("Conjunto de Términos")

            Dim lcidEspañol As Integer = (New CultureInfo("es-ES")).LCID
            Dim lcidIngles As Integer = (New CultureInfo("en-US")).LCID

            'Creamos el término con su nombre en español (debemos tener el
            'paquete de lenguaje de español instalado)
            Dim termino As Term = conjuntoDeTerminos.CreateTerm("Revista", lcidEspañol)

            'Creamos una etiqueta para el término, pero en inglés y esta
            'etiqueta la hacemos principal para el idioma inglés
            termino.CreateLabel("Magazine", lcidIngles, True)

            'Cuando se crea el término se añade la etiqueta Revista tando en Español
            'como en inglés, así que la etiqueta "Revista" para inglés la elimino 
            'despues de crear la etiqueta "Magezine" y ponerla como principal
            Dim labelCollection As LabelCollection = termino.GetAllLabels(lcidIngles)
            For Each label In labelCollection
                If label.Value = "Revista" Then
                    label.Delete()
                End If
            Next

            'Descripción en español para el término
            termino.SetDescription("Conjunto de artículos que se publican periodicamente", lcidEspañol)

            'Descripción en inglés para el término
            termino.SetDescription("Set of articles that are published periodically", lcidIngles)

            'Sinónimo para el término en español
            termino.CreateLabel("Periódico", lcidEspañol, False)

            'Sinónimo para el términos en ingles
            termino.CreateLabel("Newspaper", lcidIngles, False)

            'Confirmo los cambios
            termino.TermStore.CommitAll()


            Dim resultado As String = ""
            Dim etiquetas As LabelCollection = termino.GetAllLabels(lcidEspañol)
            Dim etiquetasString As String = ""
            For Each l In etiquetas
                etiquetasString &= l.Value & ","
            Next
            resultado &= "Todas las etiquetas en español: " & etiquetasString & ". "
            etiquetas = termino.GetAllLabels(lcidIngles)
            etiquetasString = ""
            For Each l In etiquetas
                etiquetasString &= l.Value & ","
            Next
            resultado &= "Todas las etiquetas en inglés: " & etiquetasString & ". "
            resultado &= "Descripción en inglés" & termino.GetDescription(lcidEspañol)
            resultado &= "Descripción en inglés" & termino.GetDescription()
            Console.WriteLine(resultado)
        End Using
        Console.ReadLine()

    End Sub
End Module
